/* 
 * File:   MundoSerializacion.cpp
 * Author: max
 *
 * Created on Dec 2, 2012, 11:30:48 AM
 */

#include <stdlib.h>
#include <ctime>
#include <iostream>
#include "Mundo.h"
#include "tinyxml.h"
#include "LanzadorPajaritos.h"
#include "MotorDesplazamiento.h"
#include "MotorColisiones.h"

using namespace std;
using namespace TP::Juego;
using namespace TP::Juego::Motorizacion::Generadores;
using namespace TP::Juego::Motorizacion;

/*
 * Simple C++ Test Suite
 */

void test1() {
    
    std::cout << "MundoSerializacion test 1" << std::endl;
    
    string path = "/home/max/temp/Tierra.xml";
    TiXmlDocument xmlDoc;
    TiXmlElement* mundoElement = 0;
    
    FILE *docfd = fopen(path.c_str(), "r");  // Obtengo el fd
    if (docfd)
    {
        if(xmlDoc.LoadFile(docfd)) {  // Levanto el xml

            Mundo* mundo = new Mundo();
            mundo->deElementoXML(xmlDoc.FirstChildElement());

            cout << endl << mundo->aXML() << endl;
            
            if (mundo->getNombre() != "")
                std::cout << "%TEST_FAILED% time=0 testname=test1 (MundoSerializacion) message=El mundono posee el nombre esperado." << std::endl;
                
            return;
        }
    }
    else
        std::cout << "%TEST_FAILED% time=0 testname=test1 (MundoSerializacion) message=Fallo al abrir el archivo." << std::endl;
}

void test2() {
    std::cout << "MundoSerializacion test 2" << std::endl;

    std::cout << "MundoSerializacion test 1" << std::endl;
    
    string path = "/home/max/temp/Tierra.xml";
    TiXmlDocument xmlDoc;
    TiXmlElement* mundoElement = 0;
    
    FILE *docfd = fopen(path.c_str(), "r");  // Obtengo el fd
    if (docfd)
    {
        if(xmlDoc.LoadFile(docfd)) {  // Levanto el xml

            Mundo* mundo = new Mundo();
            mundo->deElementoXML(xmlDoc.FirstChildElement());

            // Clono la partida mediante la funcionalidad de serializacion.
            Jugador* jugador = new Jugador("maxi");
            Partida* partida = new Partida("miPartida", mundo->getNivel(1)->getEscenario(), jugador);

            LanzadorPajaritos* _lanzador = new LanzadorPajaritos();

            time_t tiempoini
                 , tiempoact;
            time(&tiempoini);
            time(&tiempoact);
            while (difftime(tiempoact, tiempoini) < 6.0) 
                time(&tiempoact);

            _lanzador->disparar(partida);
            
            cout << endl << partida->aXML() << endl;
            
            time(&tiempoini);
            time(&tiempoact);
            while (difftime(tiempoact, tiempoini) < 6.0) 
                time(&tiempoact);                
            
            _lanzador->disparar(partida);
            
            cout << endl << partida->aXML() << endl;
            
            if (mundo->getNombre() != "Tierra")
                std::cout << "%TEST_FAILED% time=0 testname=test1 (MundoSerializacion) message=El mundono posee el nombre esperado." << std::endl;
                
            return;
        }
    }
    else
        std::cout << "%TEST_FAILED% time=0 testname=test2 (MundoSerializacion) message=Fallo al abrir el archivo." << std::endl;
}

void test3() {
    std::cout << "MundoSerializacion test 3" << std::endl;
    
    string path = "/home/max/temp/Tierra.xml";
    TiXmlDocument xmlDoc;
    TiXmlElement* mundoElement = 0;
    
    FILE *docfd = fopen(path.c_str(), "r");  // Obtengo el fd
    if (docfd)
    {
        if(xmlDoc.LoadFile(docfd)) {  // Levanto el xml

            Mundo* mundo = new Mundo();
            mundo->deElementoXML(xmlDoc.FirstChildElement());

            // Clono la partida mediante la funcionalidad de serializacion.
            Jugador* jugador = new Jugador("maxi");
            Partida* partida = new Partida("miPartida", mundo->getNivel(1)->getEscenario(), jugador);

            LanzadorPajaritos* _lanzador = new LanzadorPajaritos();

            cout << "Lanzamiento 0" << endl;
            cout << "=============" << endl;
            
            time_t tiempoini
                 , tiempoact;
            time(&tiempoini);
            time(&tiempoact);
            while (difftime(tiempoact, tiempoini) < 6.0) 
                time(&tiempoact);

            _lanzador->disparar(partida);
            
            cout << endl << partida->aXML() << endl;

            
            MotorDesplazamiento* motor = new MotorDesplazamiento();
            motor->correrPartida(partida, 10);
            motor->correrPartida(partida, 10);
            motor->correrPartida(partida, 10);
            motor->correrPartida(partida, 10);
            motor->correrPartida(partida, 10);
            motor->correrPartida(partida, 10);
            motor->correrPartida(partida, 10);
            
            cout << endl << partida->aXML() << endl;
            
            MotorColisiones* mc = new MotorColisiones();
            mc->correrPartida(partida, 1);
            cout << endl << partida->aXML() << endl;
//////////////////////////////////////////
            cout << "Lanzamiento 1" << endl;
            cout << "=============" << endl;
            time(&tiempoini);
            time(&tiempoact);
            while (difftime(tiempoact, tiempoini) < 6.0) 
                time(&tiempoact);

            _lanzador->disparar(partida);
            
            cout << endl << partida->aXML() << endl;

            
            motor->correrPartida(partida, 10);
            motor->correrPartida(partida, 10);
            motor->correrPartida(partida, 10);
            motor->correrPartida(partida, 10);
            motor->correrPartida(partida, 10);
            motor->correrPartida(partida, 10);
            motor->correrPartida(partida, 10);
            
            cout << endl << partida->aXML() << endl;
            
            mc->correrPartida(partida, 1);
            cout << endl << partida->aXML() << endl;
//////////////////////////////////////////
            cout << "Lanzamiento 2" << endl;
            cout << "=============" << endl;
            time(&tiempoini);
            time(&tiempoact);
            while (difftime(tiempoact, tiempoini) < 6.0) 
                time(&tiempoact);

            _lanzador->disparar(partida);
            
            cout << endl << partida->aXML() << endl;

            
            motor->correrPartida(partida, 10);
            motor->correrPartida(partida, 10);
            motor->correrPartida(partida, 10);
            motor->correrPartida(partida, 10);
            motor->correrPartida(partida, 10);
            motor->correrPartida(partida, 10);
            motor->correrPartida(partida, 10);
            
            cout << endl << partida->aXML() << endl;
            
            mc->correrPartida(partida, 1);
            cout << endl << partida->aXML() << endl;
////////////////////////////////////////////
            cout << "Lanzamiento 3" << endl;
            cout << "=============" << endl;
            time(&tiempoini);
            time(&tiempoact);
            while (difftime(tiempoact, tiempoini) < 6.0) 
                time(&tiempoact);

            _lanzador->disparar(partida);
            
            cout << endl << partida->aXML() << endl;

            
            motor->correrPartida(partida, 10);
            motor->correrPartida(partida, 10);
            motor->correrPartida(partida, 10);
            motor->correrPartida(partida, 10);
            motor->correrPartida(partida, 10);
            motor->correrPartida(partida, 10);
            motor->correrPartida(partida, 10);
            
            cout << endl << partida->aXML() << endl;
            
            mc->correrPartida(partida, 1);
            cout << endl << partida->aXML() << endl;
/////////////////////////////////////////////////
            cout << "Lanzamiento 4" << endl;
            cout << "=============" << endl;
            time(&tiempoini);
            time(&tiempoact);
            while (difftime(tiempoact, tiempoini) < 6.0) 
                time(&tiempoact);

            _lanzador->disparar(partida);
            
            cout << endl << partida->aXML() << endl;

            
            motor->correrPartida(partida, 10);
            motor->correrPartida(partida, 10);
            motor->correrPartida(partida, 10);
            motor->correrPartida(partida, 10);
            motor->correrPartida(partida, 10);
            motor->correrPartida(partida, 10);
            motor->correrPartida(partida, 10);
            
            cout << endl << partida->aXML() << endl;
            
            mc->correrPartida(partida, 1);
            cout << endl << partida->aXML() << endl;
///////////////////////////////////////////////////
            cout << "Lanzamiento 5" << endl;
            cout << "=============" << endl;
            time(&tiempoini);
            time(&tiempoact);
            while (difftime(tiempoact, tiempoini) < 6.0) 
                time(&tiempoact);

            _lanzador->disparar(partida);
            
            cout << endl << partida->aXML() << endl;

            
            motor->correrPartida(partida, 10);
            motor->correrPartida(partida, 10);
            motor->correrPartida(partida, 10);
            motor->correrPartida(partida, 10);
            motor->correrPartida(partida, 10);
            motor->correrPartida(partida, 10);
            motor->correrPartida(partida, 10);
            
            cout << endl << partida->aXML() << endl;
            
            mc->correrPartida(partida, 1);
            cout << endl << partida->aXML() << endl;
////////////////////////////////////////////////
            cout << "Lanzamiento 6" << endl;
            cout << "=============" << endl;
            time(&tiempoini);
            time(&tiempoact);
            while (difftime(tiempoact, tiempoini) < 6.0) 
                time(&tiempoact);

            _lanzador->disparar(partida);
            
            cout << endl << partida->aXML() << endl;

            
            motor->correrPartida(partida, 10);
            motor->correrPartida(partida, 10);
            motor->correrPartida(partida, 10);
            motor->correrPartida(partida, 10);
            motor->correrPartida(partida, 10);
            motor->correrPartida(partida, 10);
            motor->correrPartida(partida, 10);
            
            cout << endl << partida->aXML() << endl;
            
            mc->correrPartida(partida, 1);
            cout << endl << partida->aXML() << endl;
//////////////////////////////////
            cout << "Lanzamiento 7" << endl;
            cout << "=============" << endl;            
            time(&tiempoini);
            time(&tiempoact);
            while (difftime(tiempoact, tiempoini) < 6.0) 
                time(&tiempoact);

            _lanzador->disparar(partida);
            
            cout << endl << partida->aXML() << endl;

            
            motor->correrPartida(partida, 10);
            motor->correrPartida(partida, 10);
            motor->correrPartida(partida, 10);
            motor->correrPartida(partida, 10);
            motor->correrPartida(partida, 10);
            motor->correrPartida(partida, 10);
            motor->correrPartida(partida, 10);
            
            cout << endl << partida->aXML() << endl;
            
            mc->correrPartida(partida, 1);
            cout << endl << partida->aXML() << endl;
            return;
        }
    }
    else
        std::cout << "%TEST_FAILED% time=0 testname=test3 (MundoSerializacion) message=Fallo al abrir el archivo." << std::endl;
}

int main(int argc, char** argv) {
    std::cout << "%SUITE_STARTING% MundoSerializacion" << std::endl;
    std::cout << "%SUITE_STARTED%" << std::endl;

    std::cout << "%TEST_STARTED% test1 (MundoSerializacion)" << std::endl;
    test1();
    std::cout << "%TEST_FINISHED% time=0 test1 (MundoSerializacion)" << std::endl;

//    std::cout << "%TEST_STARTED% test2 (MundoSerializacion)\n" << std::endl;
//    test2();
//    std::cout << "%TEST_FINISHED% time=0 test2 (MundoSerializacion)" << std::endl;
//
//    std::cout << "%TEST_STARTED% test3 (MundoSerializacion)\n" << std::endl;
//    test3();
//    std::cout << "%TEST_FINISHED% time=0 test3 (MundoSerializacion)" << std::endl;

    std::cout << "%SUITE_FINISHED% time=0" << std::endl;

    return (EXIT_SUCCESS);
}

